#include "mine_usart1.h"
#include "stdio.h"
#include "stdint.h"
#include "stdlib.h"
#include "stm32f4xx.h"
#include "stm32f4xx_usart.h"
#include "stm32f4xx_gpio.h"
#include "stm32f4xx_rcc.h"
#include "misc.h"
#include "mine_fly_control.h"
#include <atkp.h>
#include "mine_remoter_ctrl.h"

void mine_usart1_init(void)
{
    // 外设时钟使能,usart1使能
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
    // 外设时钟使能,gpio使能
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE); // tx:	pa15 // PA9(TX)、PA10(RX)
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE); // rx : pb3 // PA9(TX)、PA10(RX)

    //
    GPIO_InitTypeDef GPIO_InitStruct;
    GPIO_InitStruct.GPIO_Pin = GPIO_Pin_15;   // PA15 (TX)
    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF; // 复用模式
    GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;   // 推挽输出
    GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL; // 无上拉
    GPIO_Init(GPIOA, &GPIO_InitStruct);

    GPIO_InitStruct.GPIO_Pin = GPIO_Pin_3; // PB3 (RX)
    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF;
    GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL; // 浮空输入
    GPIO_Init(GPIOB, &GPIO_InitStruct);

    // 配置PA15/PB3复用为USART1
    GPIO_PinAFConfig(GPIOA, GPIO_PinSource15, GPIO_AF_USART1);
    GPIO_PinAFConfig(GPIOB, GPIO_PinSource3, GPIO_AF_USART1);

    // usart配置
    USART_InitTypeDef USART_InitStruct;
    USART_InitStruct.USART_BaudRate = 115200;
    USART_InitStruct.USART_WordLength = USART_WordLength_8b;
    USART_InitStruct.USART_StopBits = USART_StopBits_1; // 停止位
    USART_InitStruct.USART_Parity = USART_Parity_No;    // 不校验
    USART_InitStruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
    USART_InitStruct.USART_Mode = USART_Mode_Tx | USART_Mode_Rx; // 发送+接收

    USART_Init(USART1, &USART_InitStruct);
    USART_Cmd(USART1, ENABLE); // 使能USART1

    // 中断
    USART_ITConfig(USART1, USART_IT_RXNE, ENABLE); // 接收中断
    // USART_ITConfig(USART1, USART_IT_TXE, ENABLE);  // 发送中断（可选）,加了这一行会导致printf()不能显示
    USART_ITConfig(USART1, USART_IT_IDLE, ENABLE); // 接收中断（可选）
    //
    NVIC_InitTypeDef NVIC_InitStruct;
    NVIC_InitStruct.NVIC_IRQChannel = USART1_IRQn;
    NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 7; // 抢占优先级
    NVIC_InitStruct.NVIC_IRQChannelSubPriority = 0;        // 响应优先级
    NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStruct);
}

int fputc(int ch, FILE *f)
{
    USART_SendData(USART1, (uint8_t)ch);
    while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET)
        ;
    return ch;
}

static uint8_t rx_data[256] = {0};
static uint16_t rx_index = 0;

// 接收回调
atkp_t mine_usart1_packet;
void onUsart1Receive(uint8_t *data, uint16_t len)
{
    printf("收到 :cmd=%c\n", data[0]);
    //
    //atkp_t packet = mine_usart1_packet;
    if (data[0] == '0')
    {
         mine_fly_control_set_fly_state(0);

        // packet.msgID = DOWN_REMOTER;
        // packet.dataLen = 3;
        // packet.data[0] = REMOTER_CMD;
        // packet.data[1] = CMD_FLIGHT_LAND;
        // packet.data[2] = 0U;
        // mine_remote_add_queue(&packet);
    }
    if (data[0] == '1')
    {
        //
        mine_fly_control_set_fly_state(1U);

        // packet.msgID = DOWN_REMOTER;
        // packet.dataLen = 3;
        // packet.data[0] = REMOTER_CMD;
        // packet.data[1] = CMD_FLIGHT_LAND;
        // packet.data[2] = 1U;
        // mine_remote_add_queue(&packet);
    }
    //
    if (data[0] == '2')
    {
        //
        mine_fly_control_set_fly_state(2U);

        // packet.msgID = DOWN_REMOTER;
        // packet.dataLen = 3;
        // packet.data[0] = REMOTER_CMD;
        // packet.data[1] = CMD_FLIGHT_LAND;
        // packet.data[2] = 2U;
        // mine_remote_add_queue(&packet);
    }
    if (data[0] == '3')
    {
        //
        mine_fly_control_set_fly_state(3U);

        // packet.msgID = DOWN_REMOTER;
        // packet.dataLen = 3;
        // packet.data[0] = REMOTER_CMD;
        // packet.data[1] = CMD_FLIGHT_LAND;
        // packet.data[2] = 3U;
        // mine_remote_add_queue(&packet);
    }
}

// 清空缓存数据
void clearUsart1RxBuf()
{
    rx_index = 0;
    memset(rx_data, 0, sizeof(rx_data));
}

// 单纯的发送不需要中断
void USART1_IRQHandler(void)
{
    // 接收
    if (USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
    {                                             // 接收中断
        uint8_t data = USART_ReceiveData(USART1); // 读取数据
        // 处理数据（如存入缓冲区）
        USART_ClearITPendingBit(USART1, USART_IT_RXNE); // 清除标志
                                                        // 读取数据
        rx_data[rx_index] = data;
        rx_index++;
    }

    if (USART_GetITStatus(USART1, USART_IT_IDLE) != RESET)
    {
        USART_ClearITPendingBit(USART1, USART_IT_IDLE);
        uint8_t data = USART_ReceiveData(USART1);
        rx_data[rx_index] = '\0';
        // 回调
        onUsart1Receive(rx_data, rx_index);
        //
        clearUsart1RxBuf();
    }
}

// 发送
// if (USART_GetITStatus(USART1, USART_IT_TXE) != RESET)
// { // 发送中断
//     // 填充下一字节到DR寄存器
//     USART_SendData(USART1, next_byte);
//     USART_ClearITPendingBit(USART1, USART_IT_TXE);
// }
